/**
 * Created with JetBrains WebStorm.
 * User: gcw
 * Date: 14-7-6
 * Time: 下午4:50
 * To change this template use File | Settings | File Templates.
 */
//Sanbox()构造函数，沙箱模式提供了一个可用于模块运行的环境，且不会对其他模块和个人沙箱造成任何影响
function Sandbox(){
        // 将参数转换成一个数组
    var args = Array.prototype.slice.call(arguments),  // Array.prototype.slice.call()可以将具有length属性的对象转换成为数组
        // 最后一个参数是回调函数
        callback = args.pop(),
        // 模块可以作为一个数组传递，或作为单独的参数传递
        modules = (args[0] && typeof args[0] === "string") ? args : args[0],
        i;

    // 确保该函数是作为构造函数被调用
    if (!(this instanceof Sandbox)) {
        return new Sandbox(modules, callback);
    }

    // 需要向“this”添加的属性    //-----不懂------------
    this.a = 1;
    this.b = 2;

    // 现在向该核心“this”对象添加模块
    // 没有指定模块名称或指定“*”都表示“使用所有模块”
    if (!modules || modules === "*") {
        modules = [];
        for (i in Sandbox.modules) {
            if (Sandbox.modules.hasOwnProperty(i)) {
                modules.push(i);
            }
        }
    }

    // 初始化所需的模块         //-------此处联系Sandbox.modules来一起理解-----------------
    for (i = 0; i < modules.length; i++) {
        Sandbox.modules[modules[i]](this);
    }

    // call the callback
    callback(this);
};

// 需要的任何原型属性
Sandbox.prototype = {
    name: "My App",
    version: "1.0",
    getName: function() {
        return this.name;
    }
};


// Sandbox()构造函数也同时是对象，因此为其添加一个modules的静态属性，
// 属性是包含键-值对（key-value pair）的另一个对象，其中这些键是模块的名字，值则是实现每个模块的对应函数
Sandbox.modules = {};

//此处添加一些模拟的模块
Sandbox.modules.dom = function(box) {
    box.getElement = function() {
        alert("我要获取dom元素");
    };
};
Sandbox.modules.event = function(box) {
    // 如果有需要，就访问Sandbox原型，如下：
    // box.constructor.prototype.m = "mmm";

    box.attachEvent = function(box) {
        alert("我要绑定监听事件");
    };
    box.dettachEvent = function(box) {
        alert("我要移除监听事件");
    };
};
Sandbox.modules.ajax = function(box){
    box.makeRequest = function() {
        alert("我要发送请求");
    };
    box.getResponse = function() {
        alert("我要获取响应");
    };
};